Ssh 密钥配置
这是一个涉及到 Cloudflare Tunnel (云端隧道) 和 ProxyCommand 的高级 SSH 连接配置。
在这种特殊情况下,您不能使用标准的 ssh-copy-id 命令来复制公钥,因为标准的 ssh-copy-id 流程无法直接处理 ProxyCommand 所定义的复杂隧道连接。
这里的连接实际上分成了两个步骤:
- 本地运行
cloudflared.exe建立安全的 Cloudflare 隧道连接。 - SSH 客户端通过这个隧道连接到服务器。
要在这种配置下实现免密码登录,您需要采取变通的方法:
解决方案概述
由于 ssh-copy-id 无法使用,我们需要执行 手动公钥复制,但必须确保手动复制的 SSH 连接也能使用 ProxyCommand。
核心步骤:
- 准备密钥: 确保您已经完成了本地密钥对的生成(如果还没有)。
- 验证连接: 确认当前的配置别名
ssh-lovexy已经可以成功连接(需要手动输入密码)。 - 提取公钥: 拿到您的公钥内容。
- 远程操作: 通过 SSH 登录到服务器,并手动将公钥内容写入远程服务器的
~/.ssh/authorized_keys文件中。
详细操作步骤
步骤 1:确保本地密钥就绪
如果您还没有密钥对,请先遵循标准步骤创建:
1 | ssh-keygen -t ed25519 -C "[email protected]_key" |
私钥路径默认为 ~/.ssh/id_ed25519.pub。
步骤 2:提取您的公钥内容
使用 cat 命令查看并复制完整的公钥内容。请确保您复制的是 公钥文件 (.pub)。
1 | cat ~/.ssh/id_ed25519.pub |
输出应该像这样(这是一行很长的文本):
1 | ssh-ed25519 AAAA... (非常长的字符串) [email protected]_key |
步骤 3:通过 Cloudflare Tunnel 连接到远程服务器
我们将使用您已有的配置 ssh-lovexy 进行 SSH 登录。
在终端中执行以下命令,使用您的别名连接服务器:
1 | ssh ssh-lovexy |
此时,连接会通过 cloudflared.exe 建立隧道。
- 如果 您设置了 SSH Agent 并且加入了私钥,您现在需要输入的是私钥的 Passphrase。
- 如果 您使用的是服务器密码,您需要输入的是服务器
washme用户的密码。
✅ 目的: 确保您能够成功进入远程服务器的命令行界面。
步骤 步骤 4:在服务器上手动添加公钥
一旦您通过 ssh ssh-lovexy 命令成功登录到远程服务器(服务器用户是 washme),请执行以下命令来创建或编辑 authorized_keys 文件。
⚠️ 注意: 确保您处于远程服务器的命令行环境。
创建或确认
.ssh目录存在并设置正确权限:bash1
2mkdir -p ~/.ssh
chmod 700 ~/.ssh将您的公钥内容写入
authorized_keys文件:
使用echo命令,将您在 步骤 2 中复制的完整公钥内容粘贴进去。关键操作:
bash1
echo "ssh-ed25519 AAAA... (您在步骤 2 复制的公钥内容) [email protected]_key" >> ~/.ssh/authorized_keys
- 使用
>>(双大于号) 是为了追加内容,避免覆盖可能已有的其他密钥。
- 使用
设置
authorized_keys文件的权限:bash1
chmod 600 ~/.ssh/authorized_keys
退出远程会话:
bash1
exit
步骤 5:测试免密码连接
返回本地终端,再次使用别名尝试连接:
1 | ssh ssh-lovexy |
预期结果
如果您的私钥没有设置密码短语 (Passphrase) 或已通过 SSH Agent 加载:
🚀 您应该立即无需任何输入即可连接到服务器。如果您的私钥设置了密码短语,但未启动 SSH Agent:
您将被要求输入 私钥的密码短语(而不是服务器的密码)。一旦输入,连接成功。如果已经启动 SSH Agent 并且加载了私钥 (
ssh-add):
🚀 您应该无需输入任何信息即可连接,彻底实现免密登录。
专家级考量:使用 -i 和 ~/.ssh/config 整合
为了让 SSH 客户端明确知道应该使用哪个密钥文件,即使您已经使用了默认路径(如 id_ed25519),也强烈建议在 ~/.ssh/config 中明确指定。
请修改您的配置,添加 IdentityFile 字段:
1 | Host ssh-lovexy |
通过这种方式,VS Code Remote SSH 和您的本地 SSH 客户端在连接 ssh-lovexy 时,会:
- 启动
cloudflared.exe建立隧道。 - 通过该隧道尝试使用
IdentityFile中指定的私钥进行认证。 - 如果私钥需要 Passphrase,则由 SSH Agent(或 VS Code 提示)处理。
替代方案:一步到位(针对某些环境)
在某些现代 SSH 客户端或启用了 WSL 的环境中,可以尝试手动模拟 ssh-copy-id 的逻辑,并带上 ProxyCommand,但这依赖于 SSH 客户端如何解析和执行命令。
例如:
1 | cat ~/.ssh/id_ed25519.pub | ssh -o ProxyCommand='...\cloudflared.exe access ssh --hostname %h' [email protected] 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' |
您需要将 ProxyCommand 的部分替换为您配置文件中的完整路径和参数,并用引号包围。如果您在 Windows Bash 环境下执行,需要特别注意路径和转义字符。手动登录后执行 echo 是最可靠且兼容性最好的方法。
建议的下一步行动 (Suggested Follow-up Actions)
- 确认公钥内容: 帮您再次复查公钥内容格式是否正确,并确保已正确添加
IdentityFile到~/.ssh/config。 - SSH Agent 设置优化: 帮助您检查并设置 Windows 系统上的 OpenSSH Agent 或 Git Bash 环境,确保私钥 Passphrase 能够被缓存,实现真正的无感知连接。
- Cloudflared 路径检查: 尽管配置文件中路径是绝对路径,我们还可以检查 VS Code 在执行
ProxyCommand时是否能顺利找到cloudflared.exe,确保连接前置步骤没有失败。
